#include "ringpuffer.h"
#include <stdio.h>
#include <string.h>

void printIntern(struct Rb_handle_t *puff)
{
	printf("#### Intern Struktur der Buffer ####\n");
	printf("targetThId: %d, sourceThId: %d\n", puff->targetThId, puff->sourceThId);
	printf("rIdx: %d, wIdx: %d\n", puff->rIdx, puff->wIdx);
	printf("freie buffer: %d\n", puff->freieplatz);
	printf("#### #########################  ####\n");
}

int main()
{
	printf("\n\n********TEST***********\n");

	struct Rb_handle_t *puff = initRb(0, 1, 15);
	int r = 0; // Ergebnis von test
	printf("\n----------Test 0:\n");
	printf("Erzeugt ringpuffer von grosse: %d, targetThId: %d, sourceThId: %d\n...", 15, 0, 1);
	if(puff->targetThId == 0 && puff->sourceThId == 1 && puff->buffersize == 15)
	printf("\nTest ok\n");
	else printf("\nTest nicht ok\n");
	printIntern(puff);

	int b = 14;
	size_t size;
	r = writeRb(puff, 2, 3, &b, 4); // falsch targetThId und sourceThId
	printf("\n----------Test 1:\n");
	printf("write: write mit falschen targetThId = %d und falschen sourceThId = %d\n", 2, 3);
	printf("Das Write Operation musst nicht klappen (ergebniss -1)\n ...\n", 2, 3);
	if(r<0)
		printf("test ok: r = %d\n",  r);
	else printf("test nicht ok: r = %d\n", r);
	printIntern(puff);

	printf("\n----------Test 2:\n");
	printf("write: Schreibe ein int in dem Ringpuffer\n");
	printf("item = %d, itemsize = sizeof(item) = %d, freie buffer = %d\n", b, sizeof(b), puff->freieplatz);
	printf("schreiben musst klappen\n ...\n");
	size = sizeof(b);
	r = writeRb(puff, 0, 1, &b, size); 
	
	if(r<0)	printf("Test false\n");
	else printf("Test ok\n");
	printIntern(puff);

	printf("\n----------Test 3:\n");
	char *ca = "betriebssystem";
	size = strlen(ca) +1;
	printf("write: Schreibe ein string in dem Ringpuffer\n");
	printf("item = %s, itemsize = sizeof(item) = %d, freie buffer = %d\n", ca, size, puff->freieplatz);
	printf("schreiben musst nicht klappen\n ...\n");
	r = writeRb(puff, 0, 1, &ca, size); 
	
	if(r<0)	printf("Test ok: r = %d\n", r);
	else printf("Test nicht ok: r = %d\n", r);
	printIntern(puff);
      
	printf("\n----------Test 4:\n");
	ca = "betrieb";
	size = strlen(ca)+1;
	printf("write: Schreibe ein string in dem Ringpuffer\n");
	printf("item = %s, itemsize = sizeof(item) = %d, freie buffer = %d\n", ca, size, puff->freieplatz);
	printf("schreiben musst klappen\n ...\n");
	r = writeRb(puff, 0, 1, ca, size); 
	
	if(r<0)	printf("Test nicht ok: r = %d\n", r);
	else printf("Test ok: r = %d\n", r);
	printIntern(puff);

	printf("\n----------Test 5:\n");
	b = 0;
	size = 4;
	printf("read: Telegramm auslesen\n");
	printf("item, itemsize = sizeof(item) = %d, freie buffer = %d\n", size, puff->freieplatz);
	printf("lesen musst klappen\n ...\n");
	r = readRb(puff, 0, 1, &b, &size);

	if(r==1 && b == 14)	printf("Test ok: erfolgreich ausgelesen item =%d\n", b);
	else printf("Test nicht ok, b=%d\n", b);
	printIntern(puff);

	printf("\n----------Test 6:\n");
	char* arch = (char *)malloc(4);	
	size = 4;
	printf("read: Telegramm auslesen\n");
	printf("item, itemsize = sizeof(item) = %d, freie buffer = %d\n", size, puff->freieplatz);
	printf("Nur ein Teil des Telegramm wird ausgelesen\n");
	printf("lesen musst klappen\n ...\n");
	r = readRb(puff, 0, 1, &arch, &size); 	
	if(r!=-1)	printf("Test nicht ok: item = %s, r = %d\n", &arch, r);
	else printf("Test ok: item = %s, r = %d\n", &arch, r);
	printIntern(puff);
	
	printf("\n----------Test 7:\n");
	arch =(char*)malloc(4);
	size = 4;
	printf("read: andere Teil des Telegramm auslesen\n");
	printf("item, itemsize = sizeof(item) = %d, freie buffer = %d\n", size, puff->freieplatz);
	printf("Letzte Teil des Telegramm wird ausgelesen\n");
	printf("lesen musst klappen\n ...\n");
	r = readRb(puff, 0, 1, &arch, &size); 
	
	if(r==1) printf("Test ok: r = %d, item = %s\n", r, &arch);
	else printf("Test nicht ok: item = %s,r= %d\n", &arch, r);
	printIntern(puff); 

	
	printf("\n----------Test 8:\n");
	arch ="      ";
	size = 4;
	printf("read: (kein)Telegramm auslesen\n");
	printf("item, itemsize = sizeof(item) = %d, freie buffer = %d\n", size, puff->freieplatz);
	printf("Puffer ist leer, musst nichts zurueck lesen\n");
	printf("...\n");
	r = readRb(puff, 0, 1, arch, &size); 
	
	if(r==0) printf("Test ok: r = %d, item = %s\n", r, arch);
	else printf("Test nicht ok: item = %s,r= %d\n", arch, r);
	printIntern(puff); 

	printf("\n----------Test 9:\n");
	ca = "betriebssystem";
	size = strlen(ca) +1;
	printf("write: Schreibe ein string in dem Ringpuffer\n");
	printf("item = %s, itemsize = sizeof(item) = %d, freie buffer = %d\n", ca, size, puff->freieplatz);
	printf("schreiben musst klappen\n ...\n");
	r = writeRb(puff, 0, 1, ca, size); 
	
	if(r<0)	printf("Test nicht ok: r = %d\n", r);
	else printf("Test ok: r = %d\n", r);
	printIntern(puff);
	
	printf("\n----------Test 10:\n");
	arch = (char*)malloc(15);
	size = 15;
	printf("read: Telegramm auslesen\n");
	printf("item, itemsize = sizeof(item) = %d, freie buffer = %d\n", size, puff->freieplatz);
	printf("letzte Element aus der Puffer lesen\n");
	printf("...\n");
	r = readRb(puff, 0, 1, arch, &size); 
	
	if(r==1) printf("Test ok: r = %d, item = %s\n", r, arch);
	else printf("Test nicht ok: item = %s,r= %d\n", arch, r);
	printIntern(puff); 

	freeRb(puff);
	printf("\n\n***************End Test***************\n");
	return 0;
}
